#include "protocol.hpp"
void getinput(int *x, int *y, char *oper)
{

    cout << "Please Enter x: ";
    cin >> *x;//这里一旦非法输入后(比如输入字符+ -等)；非法字符将留在缓冲区，出现读取异常，啥也没读到 ；如果后面还有cin读取那么就重复发生 开始循环！
    cout << "Please Enter y: ";
    cin >> *y;
    cout << "Please Enter oper: ";
    cin >> *oper;
}
int main(int argc, char *argv[])
{
     consolestrategy;
    //filestrategy ;
    if (argc != 3)
    {
        cerr << " please use: " << argv[0] << " server_ip server_port" << std::endl;
        return 1;
    }
    string ip = argv[1];
    uint16_t port = stoi(argv[2]);
    unique_ptr<Socket> us = make_unique<Tcpsocket>();
    us->clientsock();
    int n = us->Connect(ip, port);
    if (n == 0)
    {
        while (1)
        { // 预处理+发送：
            // 第一种输入方式：这里如果也是 3^H^H；stoi时候i会越界直接崩

            // string s;
            // getline(cin, s);
            // int i = 0;
            // while (isdigit(s[i])||i==0)//处理好第一个为负数情况
            //     i++;
            // int x = stoi(s.substr(0, i));

            // char oper = s[i];

            // int y = stoi(s.substr(i + 1));
            // 第二种输入方式：这里如果输入3  退格退格 -》 3^H^H 读取的时候自动跳过^H那么就会被留在输入缓冲区中；此时就会死循环下去
            // int x,y;
            // char oper;
            // cin>>x>>oper>>y;
            // 第三种封装后的初始化方式：
            int x, y;
            char oper;
            getinput(&x, &y, &oper);
            request re(x, y, oper);
            // 序列化：
            string ques = re.serialize();
            // 封装报头：
            protocol pl;
            pl.Encode(ques);
            // 发送
            us->Send(ques);
            // 进行接收：
            // 规定ans为0则成功：
            pl.getresponse(us); // 包括解报然后反序列化输出结果
        }
    }
    us->Close();
    return 0;
}